home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / LANG / C / LIB / EXPRO / _files / _exprodir / exproasm._s < prev    next >
Text File  |  1990-06-05  |  10KB  |  433 lines

  1. ; by Ferdinand Oeinck copyright 1990
  2. ;
  3. ; version 1.00, 04-06-1990
  4. ;
  5. ; file: exproasm.s
  6. ;
  7. ;
  8. ;
  9.  
  10.  
  11. a1 RN 0
  12. a2 RN 1
  13. a3 RN 2
  14. a4 RN 3
  15. v1 RN 4
  16. v2 RN 5
  17. v3 RN 6
  18. v4 RN 7
  19. v5 RN 8
  20. v6 RN 9
  21. sl RN 10
  22. fp RN 11
  23. ip RN 12
  24. sp RN 13
  25. lr RN 14
  26. pc RN 15
  27.  
  28. f0 FN 0
  29. f1 FN 1
  30. f2 FN 2
  31. f3 FN 3
  32. f4 FN 4
  33. f5 FN 5
  34. f6 FN 6
  35. f7 FN 7
  36.  
  37. r0 RN 0
  38. r1 RN 1
  39. r2 RN 2
  40. r3 RN 3
  41. r4 RN 4
  42. r5 RN 5
  43. r6 RN 6
  44. r7 RN 7
  45. r8 RN 8
  46. r9 RN 9
  47. r10 RN 10
  48. r11 RN 11
  49. r12 RN 12
  50. r13 RN 13
  51. r14 RN 14
  52. r15 RN 15
  53.  
  54. R0 RN 0
  55. R1 RN 1
  56. R2 RN 2
  57. R3 RN 3
  58. R4 RN 4
  59. R5 RN 5
  60. R6 RN 6
  61. R7 RN 7
  62. R8 RN 8
  63. R9 RN 9
  64. R10 RN 10
  65. R11 RN 11
  66. R12 RN 12
  67. R13 RN 13
  68. R14 RN 14
  69. PC  RN 15
  70.  
  71.     GET $.clib.s.swis
  72.  
  73. OS_check_address * &38006CC
  74. OS_check_cont    * &E58CD108
  75.  
  76.     AREA |C$$code|, CODE, READONLY
  77.  
  78.  
  79. ;****************************************************************
  80. ;*                                                              *
  81. ;*     FUNCTION TO CLAIM THE INTERRUPT AND INTERUPT HANDLER     *
  82. ;*                                                              *
  83. ;****************************************************************
  84.  
  85. exproasm_ClaimIntDeviceVector_X
  86.         DCB     "exproasm_ClaimIntDeviceVector", 0
  87.         ALIGN
  88. exproasm_ClaimIntDeviceVector_Y
  89.         DCD     &ff000000 + exproasm_ClaimIntDeviceVector_Y - exproasm_ClaimIntDeviceVector_X
  90.  
  91.         EXPORT  exproasm_ClaimIntDeviceVector
  92.  
  93. exproasm_ClaimIntDeviceVector 
  94.                        ;void exproasm_ClaimIntDeviceVector(int *adr, int *cnt, int count);
  95.  
  96.         LDR    a1, expro_check
  97.         LDR    a2, expro_check + 4
  98.         LDR    a1, [a1]
  99.         CMP    a1, a2                           ; check if running under RISCOS 2.00
  100.         MOVNE  a1, #0
  101.         MOVNES pc, lr                           ; no
  102.  
  103.         MOV    a1, #0
  104.         LDR    a3, [a1, #4]                     ; load undefined instr. vector
  105.         STR    a3, default_undef_vector
  106.         BIC    a3, a3, #&FF000000                ; clear branch bits
  107.         MOV    a3, a3, LSL #2
  108.         ADD    a3, a3, #12                      ; address 
  109.         STR    a3, default_undef_instr          ; save undefined instr. address
  110.  
  111.         ADR    a2, undefined_instr
  112.         SUB    a2, a2, #12
  113.         MOV    a2, a2, LSR #2
  114.         ORR    a2, a2, #&EA000000
  115.         STR    a2, [a1, #4]                     ; save my undefined instr. address
  116.         STR    a2, my_undef_branch
  117.  
  118.         MOV    a1, #1                           ; yes
  119.         ADR    a2, exproasm_every
  120.         MOV    a3, #0
  121.         SWI    OS_CallEvery
  122.  
  123.         MOV    a1, #1
  124.         LDR    a2, expro_claimed
  125.         STR    a1, [a2]
  126.  
  127.         MOVS   pc, lr
  128.  
  129. expro_check
  130.         DCD    OS_check_address
  131.         DCD    OS_check_cont
  132.  
  133. default_undef_vector
  134.         DCD    0
  135. my_undef_branch
  136.         DCD    0
  137.  
  138. expro_claimed
  139.         DCD    |x$dataseg| + 4
  140.  
  141.         EXPORT expro_fp_return_address
  142. expro_fp_return_address
  143.         DCD    0
  144.  
  145. ;****************************************************************
  146.  
  147. exproasm_ReleaseIntDeviceVector_X
  148.         DCB     "exproasm_ReleaseIntDeviceVector", 0
  149.         ALIGN
  150. exproasm_ReleaseIntDeviceVector_Y
  151.         DCD  &ff000000+exproasm_ReleaseIntDeviceVector_Y-exproasm_ReleaseIntDeviceVector_X
  152.  
  153.         EXPORT  exproasm_ReleaseIntDeviceVector
  154.  
  155. exproasm_ReleaseIntDeviceVector ;    void exproasm_ReleaseIntDeviceVector(void);
  156.  
  157.  
  158.         ADR    a1, exproasm_every
  159.         MOV    a2, #0
  160.         SWI    OS_RemoveTickerEvent
  161.  
  162.         LDR    a1, default_undef_vector
  163.         MOV    a2, #0
  164.         STR    a1, [a2, #4]                     ; restore undefined inst. vector
  165.  
  166.         MOV    a1, #0
  167.         LDR    a2, expro_claimed
  168.         STR    a1, [a2]
  169.  
  170.         MOVS   pc, lr
  171.  
  172. ;****************************************************************
  173.  
  174. exproasm_every_X
  175.         DCB     "exproasm_every", 0
  176.         ALIGN
  177. exproasm_every_Y
  178.         DCD  &ff000000 + exproasm_every_Y - exproasm_every_X
  179.  
  180.         IMPORT binsearch
  181.  
  182. exproasm_every
  183.         STMFD  sp!, {a1-a4, ip, lr}
  184.         MOV    a1, #0
  185.         LDR    a2, [a1, #264]                   ; OS stack storage
  186.         LDR    a1, [a2, #28]                    ; 8 regs on stack => 7 * 4 = 28
  187.         BIC    a1, a1, #&FC000003
  188.         BL     binsearch
  189.         LDMFD  sp!, {a1-a4, ip, pc}
  190.  
  191.  
  192. undefined_instr    
  193.         STMFD  sp!, {a1}
  194.         BIC    a1, lr, #&FC000003                ; return address
  195.         STR    a1, expro_fp_return_address
  196.         LDMFD  sp!, {a1}
  197.         LDR    pc, default_undef_instr
  198.  
  199. default_undef_instr
  200.         DCD    0
  201.  
  202. ;****************************************************************
  203. ;*                                                              *
  204. ;*     FUNCTIONS TO GET THE RELEVANT LINKER AREAS TO C          *
  205. ;*                                                              *
  206. ;****************************************************************
  207.  
  208. exproasm_getstart_X
  209.         DCB     "exproasm_getstart", 0
  210.         ALIGN
  211. exproasm_getstart_Y
  212.         DCD     &ff000000 + exproasm_getstart_Y - exproasm_getstart_X
  213.  
  214.         EXPORT  exproasm_getstart
  215.  
  216. exproasm_getstart                       ; void exproasm_getstart(void);
  217.         ADR    a1, exproasm_data
  218.         LDR    a1, [a1, #0]
  219.         MOV    pc, lr
  220.  
  221. ;****************************************************************
  222.  
  223. exproasm_getend_X
  224.         DCB     "exproasm_getend", 0
  225.         ALIGN
  226. exproasm_getend_Y
  227.         DCD     &ff000000 + exproasm_getend_Y - exproasm_getend_X
  228.  
  229.  
  230.         EXPORT  exproasm_getend
  231.  
  232. exproasm_getend                         ; void exproasm_getend(void);
  233.         ADR    a1, exproasm_data
  234.         LDR    a1, [a1, #4]
  235.         MOV    pc, lr
  236.  
  237.  
  238.         EXPORT exproasm_getlangdesblock
  239.  
  240. exproasm_getlangdesblock                ; void exproasm_getlangdesblock(void);
  241.         ADR     a1, exproasm_data
  242.         LDR     a1, [a1, #8]
  243.         MOV     pc, lr
  244.  
  245.  
  246.         IMPORT  |C$$code$$Base|
  247.         IMPORT  |C$$code$$Limit|
  248.         IMPORT  |RTSK$$Data$$Base|
  249.  
  250. exproasm_data
  251.         DCD     |C$$code$$Base|
  252.         DCD     |C$$code$$Limit|
  253.         DCD     |RTSK$$Data$$Base|
  254.  
  255.  
  256.  
  257.  
  258.  
  259. ;****************************************************************
  260. ;*                                                              *
  261. ;*     REDEFINITION OF wimp_poll AND wimp_pollidle              *
  262. ;*                                                              *
  263. ;****************************************************************
  264.  
  265.         EXPORT  wimp_poll
  266.         IMPORT  |_kernel_fpavailable|
  267. wimp_poll
  268.         MOV     R12,R13
  269.         STMDB   R13!,{R4,R5,R11,R12,R14,PC}
  270.         SUB     R11,R12,#4
  271.         MOV     R5,R0
  272.         MOV     R4,R1
  273.         LDR     R0, fp_state_ptr
  274.         LDR     R0,[R0],#0
  275.         CMP     R0,#0
  276.         BLNE    |_kernel_fpavailable|
  277.         CMPNE   R0,#0
  278.         BLNE    save_fpe_state
  279.         MOV     R14,R0
  280.  
  281.         LDR     r0, expro_claimed
  282.         LDR     r0, [r0]
  283.         CMP     r0, #1
  284.         BNE     poll_no_expro1
  285.  
  286.         ADR     r0, exproasm_every
  287.         MOV     r1, #0
  288.         SWI     OS_RemoveTickerEvent
  289.         LDR     r0, default_undef_vector
  290.         MOV     r1, #0
  291.         STR     r0, [r1, #4]
  292.  
  293. poll_no_expro1        
  294.         MOV     R0,R5
  295.         ADD     R1,R4,#4
  296.         SWI     XOS_Bit:OR:Wimp_Poll
  297.         SUB     R1,R1,#4
  298.         STR     R0,[R1,#0]
  299.         MOVVC   R0,#0
  300.         CMP     R14,#0
  301.         BLNE    restore_fpe_state
  302.  
  303.         MOV     r5, r0
  304.         LDR     r0, expro_claimed
  305.         LDR     r0, [r0]
  306.         CMP     r0, #1
  307.         BNE     poll_no_expro2
  308.  
  309.         LDR     a2, my_undef_branch
  310.         MOV     a1, #0
  311.         STR     a2, [a1, #4]
  312.         MOV     a1, #1
  313.         ADR     a2, exproasm_every
  314.         MOV     a3, #0
  315.         SWI     OS_CallEvery
  316.         
  317. poll_no_expro2
  318.         MOV     r0, r5
  319.         LDMDB   R11,{R4,R5,R11,R13,PC}^
  320.  
  321.  
  322.         EXPORT  wimp_pollidle
  323.         IMPORT  |_kernel_fpavailable|
  324. wimp_pollidle
  325.         MOV     R12,R13
  326.         STMDB   R13!,{R4-R6,R11,R12,R14,PC}
  327.         SUB     R11,R12,#4
  328.         MOV     R5,R0
  329.         MOV     R4,R1
  330.         MOV     R6,R2
  331.         LDR     R0, fp_state_ptr
  332.         LDR     R0,[R0],#0
  333.         CMP     R0,#0
  334.         BLNE    |_kernel_fpavailable|
  335.         CMPNE   R0,#0
  336.         BLNE    save_fpe_state
  337.         MOV     R14,R0
  338.  
  339.         LDR     r0, expro_claimed
  340.         LDR     r0, [r0]
  341.         CMP     r0, #1
  342.         BNE     pollidle_no_expro1
  343.  
  344.         ADR     r0, exproasm_every
  345.         MOV     r1, #0
  346.         SWI     OS_RemoveTickerEvent
  347.         LDR     r0, default_undef_vector
  348.         MOV     r1, #0
  349.         STR     r0, [r1, #4]
  350.  
  351. pollidle_no_expro1
  352.         MOV     R0,R5
  353.         ADD     R1,R4,#4
  354.         MOV     R2,R6
  355.         SWI     XOS_Bit:OR:Wimp_PollIdle
  356.         CMP     R14,#0
  357.         BLNE    restore_fpe_state
  358.         SUB     R1,R1,#4
  359.         STR     R0,[R1,#0]
  360.         MOVVC   R0,#0
  361.  
  362.         MOV     r5, r0
  363.         LDR     r0, expro_claimed
  364.         LDR     r0, [r0]
  365.         CMP     r0, #1
  366.         BNE     pollidle_no_expro2
  367.  
  368.         LDR     a2, my_undef_branch
  369.         MOV     a1, #0
  370.         STR     a2, [a1, #4]
  371.         MOV     a1, #1
  372.         ADR     a2, exproasm_every
  373.         MOV     a3, #0
  374.         SWI     OS_CallEvery
  375.  
  376. pollidle_no_expro2
  377.         MOV     r0, r5
  378.  
  379.         LDMDB   R11,{R4-R6,R11,R13,PC}^
  380.  
  381. save_fpe_state
  382.         RFS     R1
  383.         STMDB   R13!,{R1}
  384.         MOV     R1,#0
  385.         WFS     R1
  386.         SUB     R13,R13,#&30
  387.         STFE    f4,[R13,#0]
  388.         STFE    f5,[R13,#12]
  389.         STFE    f6,[R13,#24]
  390.         STFE    f7,[R13,#36]
  391.         MOVS    PC,R14
  392.  
  393. restore_fpe_state
  394.         MOV     R4,#0
  395.         WFS     R4
  396.         LDFE    f4,[R13,#0]
  397.         LDFE    f5,[R13,#12]
  398.         LDFE    f6,[R13,#24]
  399.         LDFE    f7,[R13,#36]
  400.         ADD     R13,R13,#&30
  401.         LDMIA   R13!,{R4}
  402.         WFS     R4
  403.         MOVS    PC,R14
  404.  
  405.  
  406.         EXPORT  wimp_save_fp_state_on_poll
  407. wimp_save_fp_state_on_poll
  408.         LDR     R0, fp_state_ptr
  409.         MOV     R1,#1
  410.         STR     R1,[R0],#0
  411.         MOVS    PC,R14
  412.  
  413.  
  414.         EXPORT  wimp_corrupt_fp_state_on_poll
  415. wimp_corrupt_fp_state_on_poll
  416.         LDR     R0, fp_state_ptr
  417.         MOV     R1,#0
  418.         STR     R1,[R0],#0
  419.         MOVS    PC,R14
  420.  
  421. fp_state_ptr
  422.         DCD     |x$dataseg|
  423.  
  424. ;****************************************************************
  425.  
  426.  
  427.     AREA |C$$data|
  428.  
  429. |x$dataseg|
  430.         DCD     0
  431.         DCD     0
  432.     END
  433.